/*
 * eiam-protocol-core - Employee Identity and Access Management
 * Copyright © 2022-Present Jinan Yuanchuang Network Technology Co., Ltd. (support@topiam.cn)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package cn.topiam.employee.protocol.code.configurer;

import org.springframework.security.config.annotation.ObjectPostProcessor;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.util.matcher.RequestMatcher;

/**
 * Base configurer
 *
 * @author TopIAM
 * Created by support@topiam.cn on  2023/6/27 21:06
 */
@SuppressWarnings("AlibabaClassNamingShouldBeCamel")
public abstract class AbstractConfigurer {
    private final ObjectPostProcessor<Object> objectPostProcessor;

    public AbstractConfigurer(ObjectPostProcessor<Object> objectPostProcessor) {
        this.objectPostProcessor = objectPostProcessor;
    }

    /**
     * init
     *
     * @param httpSecurity {@link HttpSecurity}
     */
    public abstract void init(HttpSecurity httpSecurity);

    /**
     * configure
     *
     * @param httpSecurity {@link HttpSecurity}
     */
    public abstract void configure(HttpSecurity httpSecurity);

    /**
     * 获取请求匹配器
     *
     * @return {@link RequestMatcher}
     */
    public abstract RequestMatcher getRequestMatcher();

    public final <T> T postProcess(T object) {
        return (T) this.objectPostProcessor.postProcess(object);
    }

    public final ObjectPostProcessor<Object> getObjectPostProcessor() {
        return this.objectPostProcessor;
    }

}
